﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

	//指针
	//指针就是地址


	//指针变量
	//int a = 10;
	//int* pa = &a;//取出a的地址存放在指针变量

	//int* pa 
	// * 是说明pa是指针变量  int 说明pa指向整型（int）

	//解引用操作符
	//我们只要拿到了地址（指针），
	// 就可以通过地址（指针）找到地址（指针）指向的对象
	//int a = 100;
	//int* pa = &a;
	//*pa = 20;  //*pa == a；
	//printf("%d\n", a);


	//指针变量的大小
	//是固定的，这取决于不同的编译环境
	//如x64环境下是8个字节，在x86环境下是4个字节

	//printf("%d\n", sizeof(int *));
	//printf("%d\n", sizeof(char *));
	//printf("%d\n", sizeof(short *));
	//printf("%d\n", sizeof(double *));


	//指针 + -整数
		//int n = 10;
		//char* pc = (char*)&n;
		//int* pi = &n;
		//printf("%p\n", &n);//0
		//printf("%p\n", pc);//0
		//printf("%p\n", pc + 1);//0+1
		//printf("%p\n", pi);//0
		//printf("%p\n", pi + 1);//0+4
		
		
	//void* 指针
	//void* 类型的指针可以接收不同类型的地址，
	// 但是⽆法直接进⾏指针运算。
	
	//int a = 10;
	//int* pa = &a;
	//char* pc = &a;//err

	//const修饰指针
	//const修饰的变量会拥有常量的属性，无法直接更改


	//const修饰的变量不是真的常量，还是可以通过其他的
	//手段更改的

	//const int n = 0;
	//printf("n = %d\n", n);
	//int* p = &n;
	//*p = 20;
	//printf("n = %d", n);


	//const修饰指针变量的时候

	/*const如果放在* 的左边，修饰的是指针指向的内容，
	保证指针指向的内容不能通过指针来改变。
	但是指针变量本⾝的内容可变。

	const如果放在* 的右边，修饰的是指针变量本⾝，
	保证了指针变量的内容不能修改，但是指针指
	向的内容，可以通过指针改变*/

//#include <stdio.h>
//	//代码1
//	void test1()
//	{
//		int n = 10;
//		int m = 20;
//		int* p = &n;
//		*p = 20;//ok?
//		p = &m; //ok?
//	}
	//void test2()
	//{
	//	//代码2
	//	int n = 10;
	//	int m = 20;
	//	const int* p = &n;
	//	*p = 20;//ok?
	//	p = &m; //ok?
	//}
//	void test3()
//	{
//		int n = 10;
//		int m = 20;
//		int* const p = &n;
//		*p = 20; //ok?
//		p = &m; //ok?
//	}
//	void test4()
//	{
//		int n = 10;
//		int m = 20;
//		int const* const p = &n;
//		*p = 20; //ok?
//		p = &m; //ok?
//	}
//	int main()
//	{
//		//测试⽆const修饰的情况
//		test1();
//		//测试const放在*的左边情况
//		test2();
//		//测试const放在*的右边情况
//		test3();
//		//测试*的左右两边都有const
//		test4();
//		return 0;
//}


//int main()
//{
//
//
//	unsigned long pulArray[] = { 6,7,8,9,10 };
//	unsigned long* pulPtr;
//	pulPtr = pulArray;//6
//	*(pulPtr + 3) += 3;
//	printf("%d,%d\n", *pulPtr, *(pulPtr + 3));
//
//	return 0;
//}


////[编程题]字符逆序
//#include<stdio.h>
//#include<string.h>
//int main() {
//	char arr[10001] = { 0 };
//	while (gets(arr))
//	{
//		//注：这里不能使用scanf("%d",str)函数，含空格字符串会被视为多组输入。
//		//计算字符串长度
//		int len = strlen(arr);
//
//		for (int i = len - 1; i >= 0; i--)
//		{
//			printf("%c", arr[i]);
//		}
//
//		printf("\n");
//	}
//}

//字符串左旋
//void left_chat(char arr[], int k)
//{
//	int left = 0;
//	int len = sizeof(arr) / sizeof(arr[0]);
//	int right = len - 1;
//	for (int i = 0; i <= k; i++)
//	{
//		int tep = 0;
//		tep = arr[left];
//		arr[right] = arr[left];
//		arr[left] = tep;
//		left++;
//		right--;
//	}
//}
//
//
//int main()
//{
//	char arr[5] = { "ABCD" };
//	//输入要左旋的次数
//	int k = 0;
//	scanf("%d", &k);
//	left_chat(arr, k);
//	printf("%s\n", arr);
//	return 0;
//}